package step4;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;

/**
 * EchoServer 구현하기 
 * client가 server에 보낸 메세지를 입력받아
 * 콘솔에 출력하고 다시 그 메세지+server 를 클라이언트로
 * 지속적으로 출력하는 예제 
 * ( 주의 : client 와 server 는 1 대 1 ) 
 * ( hint : accept() 위치를 while(){} 안 or 밖 ?
 * 	 Stream 생성 횟수 ? 
 * )  
 * @author kosta-00-kangsa-001
 *  coding 단계 
 *  1. ServerSocket 생성 
 *  2. accept() : Socket
 *  3. Stream 생성
 *  	socket.getInputStream()->InputStreamReader->BufferedReader
 *      socket.getOutputStream()->PrintWriter 
 *  4. while(true) 
 *  	readLine() ---> point : 더 이상 읽을 내용이 없으면 null이 반환
 *      sysout(str)
 *      println(str+" server^^") 
 *  5. close    
 */
public class TestEchoServer {
	//서버 소켓 : 대기하다 클라이언트 접속하면 수행하는 accept()
	// 즉 대표전화의 역할 
	private ServerSocket serverSocket;
	//일반 소켓 : 개별 클라이언트 통신하는 역할 (IO)
	// 개별 안내원 전화 
	private Socket socket;
	// 클라이언트의 메세지를 입력받기 위한 스트림 
	private BufferedReader br;
	// 클라이언트에게 메세지를 출력하기 위한 스트림 
	private PrintWriter pw;
	public void go() throws IOException{
		try{
		serverSocket=new ServerSocket(5432);
		System.out.println("**EchoServer 실행**");
		// 대기하다가 클라이언트 접속하면 일반 소켓을 반환한다. 
		socket=serverSocket.accept();
		String ip="["+socket.getInetAddress().toString()+"]";
		br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		pw=new PrintWriter(socket.getOutputStream(),true);
		while(true){
			try{
			//readLine() 더이상 읽을 내용이 없으면 null이 반환 
			String mess=br.readLine();
			// 클라이언트가 exit 로 프로그램을 종료할 때 수행 
			if(mess==null){
				System.out.println(ip+"님이 종료하고 나가셨음~");
				break;
			}
			System.out.println(ip+mess);//클라이언트 데이터 출력
			// 클라이언트에게 데이터를 출력 
			pw.println(mess+" server~~~~");
			// 클라이언트가 프로그램 강제로 종료할 때 예외 발생 
			}catch(SocketException se){
				System.out.println(ip+"님이 확 꺼버리고 가버렸음~");
				break;
			}
		}
		}finally{// 예외 발생 및 처리와 관계없이 무조건 수행 
		closeAll();
		}
	}
	public void closeAll() throws IOException{
		if(pw!=null)
		pw.close();
		if(br!=null)
		br.close();
		if(socket!=null)
		socket.close();
		if(serverSocket!=null)
		serverSocket.close();
	}
	public static void main(String[] args) {
		TestEchoServer server=new TestEchoServer();
		try {
			server.go();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}









